package main

import (
	"fmt"
	"reflect"
	"unsafe"
)

func main() {
	s := "abc\x61\u0041"
	fmt.Println(s)
	//字符串的默认值不是nil 是""
	var s2 string
	//fmt.Println(s2 == nil)
	fmt.Println(s2 == "")

	s3 := "abc\ndef"
	fmt.Println(s3)
	s33 := "abc\\ndef"
	fmt.Println(s33)
	s333 := `abc\ndef` //原生字符串，不会换行
	fmt.Println(s333)
	s3333 := `abc\ndef
    dfr` //原生字符串，不会换行
	fmt.Println(s3333)

	s4 := "ab" + "cd" //字符串可比较大小
	fmt.Println(s4 == "abcd")
	fmt.Println(s4 > "bbc")

	s5 := "abcd" //字符串也可以索引
	fmt.Println(s5)
	fmt.Printf("%c", s5[1])

	//s5[1] = "f" 不能这样改变字符串

	s6 := s5[1:3] //字符串也可以做切片处理
	fmt.Println(s6)

	s7 := s5[:4]
	fmt.Println(s7)

	fmt.Printf("%#v\n", (*reflect.StringHeader)(unsafe.Pointer(&s5)))
	fmt.Printf("%#v\n", (*reflect.StringHeader)(unsafe.Pointer(&s6)))
	fmt.Printf("%#v\n", (*reflect.StringHeader)(unsafe.Pointer(&s7)))

	for i := 0; i < len(s5); i++ {
		fmt.Printf("%c", s5[i])
	}

	for i, c := range s5 {
		fmt.Printf("%d,%c", i, c)
	}

	b := []byte(s5) //轻易不要转化，会降低程序性能。
	fmt.Println(b)
	b[0] = 98
	s8 := string(b)
	fmt.Println(s8)

	//s9 := make([]byte, 100)
	//bytes.Buffer()
}
